home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs55.d81 / bincmp.c < prev    next >
Text File  |  2009-10-10  |  4KB  |  162 lines

  1. /*
  2.   ╨ROGRAM: BINCMP - COMPARE BINARY FILES
  3.   ╓ERSION: 1.0  01/31/86
  4.   ┴UTHOR:  ═ARK ╥. ╥INFRET
  5.  
  6.   ╙YNOPSIS:
  7.  
  8.     $ BINCMP FILE1 FILE2     (╙┼╤ ╞ILES)
  9.     $ BINCMP FILE1,P FILE2,P (╨╥╟ FILES)
  10.  
  11.     ╞ILENAMES MAY ALSO CONTAIN DEVICE NUMBER SPECIFICATION (E.G. #9:FILE1).
  12.  
  13.   ─ESC.:
  14.  
  15.     ┬INCMP COMPARES TWO FILES (╙┼╤,╨╥╟) AS BINARY DATA, REPORTING
  16.     DIFFERENCES TO STANDARD OUTPUT.
  17.  
  18.     ╫RITTEN FOR ├OMMODORE ├64 W/├-╨OWER
  19.  
  20.  
  21.   ╬╧╘┼: ╘HIS PROGRAM USES A MODIFIED FREAD ROUTINE (╥AY ┌ARLING) WHICH
  22.         RETURNS THE NUMBER OF ELEMENTS READ RATHER THAN THE SIMPLE 1 OR
  23.         0 WHICH THE NON-STANDARD ├-╨OWER FREAD RETURNS.  ╘HE BUFFERING
  24.         ACCOMPLISHED BY USING FREAD PROVIDES A SIGNIFICANT IMPROVEMENT
  25.         IN PERFORMANCE (VS. FGETC).
  26.      
  27. */
  28.  
  29. #INCLUDE <STDIO.H>
  30.  
  31. CHAR *MALLOC();
  32.  
  33. #DEFINE ┬╒╞╙╔┌ 254*4   /* SIZE OF FOUR FULL SECTORS */
  34. #DEFINE ═┴╪┼╥╥ 200     /* MAXIMUM MISMATCHES ALLOWED */
  35.  
  36. CHAR *BUF1,*BUF2;
  37.  
  38. UNSIGNED BIAS,ERRCNT,I,LAST,LAST1,LAST2;
  39. ╞╔╠┼ *FIL1;
  40. ╞╔╠┼ *FIL2;
  41.  
  42. /* ╬OTE: FUNCTIONAL DESIGN COULD HAVE BEEN CLEANER, BUT THE PROGRAM IS
  43.          SMALL - SO WHY BOTHER? 
  44. */
  45. MAIN(ARGC,ARGV)
  46. CHAR **ARGV;
  47.   STATIC CHAR *NOTOPEN = "├AN'T OPEN %S\N";
  48.   STATIC CHAR *LONGER = "%S IS LONGER!\N\N";
  49.  
  50.   IF (ARGC != 3) HELP();
  51.  
  52.   BUF1 = MALLOC(┬╒╞╙╔┌); /* ─YNAMIC ALLOCATION SAVES ON PROGRAM FILE SIZE */
  53.   BUF2 = MALLOC(┬╒╞╙╔┌);
  54.  
  55.   IF ((FIL1=OPENFILE(ARGV[1],"R"))==╬╒╠╠ ▀▀ FERROR())
  56.     █
  57.       PRINTF(NOTOPEN,ARGV[1]);
  58.       EXIT();
  59.     ▌
  60.  
  61.   IF ((FIL2=OPENFILE(ARGV[2],"R"))==╬╒╠╠ ▀▀ FERROR())
  62.     █
  63.       PRINTF(NOTOPEN,ARGV[2]);
  64.       EXIT();
  65.     ▌
  66.  
  67.   PRINTF("    %-16S %-16S\N\N",ARGV[1],ARGV[2]);
  68.   
  69.   BIAS = 0;
  70.  
  71.   FOR (ERRCNT = 0 ; ERRCNT < 20 ;)
  72.   █
  73.     LAST1 = FREAD(BUF1,1,┬╒╞╙╔┌,FIL1); /* READ FROM FILE 1 */
  74.     LAST2 = FREAD(BUF2,1,┬╒╞╙╔┌,FIL2); /* READ FROM FILE 2 */
  75.  
  76.     LAST = LAST1;
  77.     IF (LAST1 != LAST2) █
  78.       IF (LAST1 > LAST2) █
  79.         LAST = LAST2;
  80.         PRINTF(LONGER,ARGV[1]);
  81.       ▌
  82.       ELSE 
  83.         PRINTF(LONGER,ARGV[2]); 
  84.     ▌
  85.  
  86.     FOR (I=0; I<LAST; I++) █
  87.       IF (BUF1[I] != BUF2[I]) █
  88.         ERRCNT++;
  89.         PRINTF("%04X     %02X               %02X\N",BIAS+I,BUF1[I],BUF2[I]);
  90.         IF (ERRCNT > ═┴╪┼╥╥) █
  91.           PUTS("\N╘OO MANY ERRORS!\N");
  92.           BREAK;
  93.         ▌
  94.       ▌
  95.     ▌
  96.     IF (LAST<┬╒╞╙╔┌) BREAK;
  97.     BIAS += ┬╒╞╙╔┌;
  98.   ▌
  99.   IF (LAST1==LAST2 && ERRCNT==0)
  100.     PUTS("\N╞ILES MATCH.");
  101.   ELSE █
  102.     IF (ERRCNT)
  103.       PRINTF("\N╘HERE WERE AT LEAST %D MISMATCHES.\N",ERRCNT);
  104.     ELSE
  105.       PUTS("\N╘HERE WERE NO MISMATCHES TO THIS POINT.");
  106.   ▌
  107.  
  108.  
  109. /* ╧PEN A FILE, ALLOWING DEVICE SPECIFICATION. */
  110.  
  111. OPENFILE(NAME,HOW)
  112. CHAR *NAME,*HOW;
  113.  
  114.   CHAR *XNAME;
  115.   CHAR C;
  116.   UNSIGNED DVC;
  117.  
  118.   XNAME = NAME; /* COPY POINTER */
  119.   DVC = 8;      /* DEFAULT IS DEVICE 8 */
  120.   IF ((C=*XNAME) == '#') █
  121.     XNAME++;
  122.     IF (((C=*XNAME) == '8') ▀▀ ((C=*XNAME) == '9')) █
  123.       XNAME++;
  124.       DVC = (8 + (C - '8'));
  125.       IF (*XNAME==':') XNAME++;
  126.       ELSE █
  127.         PRINTF("MISSING ':' IN DEVICE SPECIFICATION\N%S\N",XNAME);
  128.         RETURN ╬╒╠╠;
  129.         ▌
  130.       ▌
  131.     ELSE █
  132.       PRINTF("ILLEGAL DEVICE NUMBER:\N%S\N",XNAME);
  133.       RETURN ╬╒╠╠;
  134.       ▌
  135.     ▌
  136.  
  137.   DEVICE(DVC);
  138.   RETURN (FOPEN(XNAME,HOW));
  139.  
  140. /* ┼XPLAIN PROGRAM TO USER */
  141. HELP()
  142.   PUTS("╘HIS PROGRAM COMPARES 2 FILES AS BINARY");
  143.   PUTS("DATA.  ╔T CAN BE USED TO COMPARE EITHER");
  144.   PUTS("╙┼╤ OR ╨╥╟ FILES (OR ONE OF EACH).");
  145.   PUTS("╥EMEMBER TO SUFFIX ╨╥╟ FILENAMES WITH");
  146.   PUTS("',P'.  ┴LSO, THE DEVICE NUMBER FOR EACH");
  147.   PUTS("FILE MAY BE SPECIFIED.");
  148.   PUTS("╒SAGE: $ BINCMP FILE1 FILE2");
  149.   PUTS("       $ BINCMP #8:FILE1,P #9:FILE2,P");
  150.   PUTS("\N╘HIS PROGRAM IS CURRENTLY HARDWIRED TO");
  151.   PRINTF("ABORT AFTER %D ERRORS.\N",═┴╪┼╥╥);
  152.   PUTS("╥EMEMBER, WHEN COMPARING ╨╥╟ FILES THAT");
  153.   PUTS("THE ADDRESS REPORTED SHOULD BE ADJUSTED");
  154.   PUTS("BY LOAD ADDRESS MINUS 2 (LA-2).");
  155.   EXIT();